#pragma once
#include <grpcpp/grpcpp.h>
#include "db_server.grpc.pb.h"


using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;

class dbClient {
public:
	dbClient(std::shared_ptr<Channel> channel) : stub_(dbserver::Database::NewStub(channel)) {}

	int userSearchByID(const int& id);
	std::string userGetNameByID(const int& id);
	std::string userGetPasswordByID(const int& id);
	int userUpdateNameByID(const int& id, const std::string& name);
	int userUpdatePasswordByID(const int& id, const std::string& password);
	int userDeleteByID(const int& id);
	int userInsert(const int& id, const std::string& name, const std::string& password);


	struct user_info
	{
		int id, age;
		std::string sex, info, email, phone, gtime;
	};
	int user_infoSearchByID(const int& id);
	int user_infoInsert(const user_info& uf);
	int user_infoDeleteByID(const int& id);
	int user_infoUpdateByID(const user_info& uf);
	user_info user_infoGetInfoByID(const int& id);


	struct server_log
	{
		int id, level;
		std::string data, time;
	};
	int server_logSearchByID(const int& id);
	int server_logInsert(const server_log& sl);
	int server_logDeleteByID(const int& id);
	int server_logUpdateByID(const server_log& sl);
	server_log server_logGetLogByID(const int& id);


	struct message_log
	{
		int id, send_id, receive_id, status;
		std::string data, time;
	};
	int message_logSearchByID(const int& id);
	std::string message_logGetMessageByUserID(const int& id);
	int message_logInsert(const message_log& ml);


	struct friend_table
	{
		int friend_id, user_id_a, user_id_b;
		std::string friend_time;
	};
	int friend_tableSearchByID(const int& id);
	std::string friend_tableGetFriendsByUserID(const int& id);
	int friend_tableIsFriend(const int& ida, const int& idb);
	int friend_tableDeleteByUserID(const int& ida, const int& idb);
	int friend_tableInsert(const friend_table& ft);

private:
	std::unique_ptr<dbserver::Database::Stub> stub_;
};